package com.yc.testThread;

import org.apache.commons.collections4.MapUtils;
import org.springframework.transaction.annotation.Transactional;

import java.util.Map;

/**
 * Created with IntelliJ IDEA.
 * description:
 * author: yc
 * date: 2021/2/7 10:10
 */
public class C2 {

    /**
     * 测试方法1
     * (方法内不要捕获获业务逻辑的异常，否则事务无法回滚)
     * @param param
     * @return
     */
    @Transactional(rollbackFor = Exception.class)//事务1
    public void m1(Map param) {
        String param1 = MapUtils.getString(param, "Param1");
        System.out.println("m1从param取出自己的参数：" + param1);

        System.out.println("。。。m1内的业务逻辑。。。");
        try {//service里的非运行时异常，一定要处理掉，也就是方法上不要有throws Exception(否则controller里无法把该方法写成“方法引用”的形式)
            Thread.sleep(300);//模拟执行300毫秒
        } catch (InterruptedException e) {
            throw new RuntimeException(e);//如果这里处理不了，可以转成运行时异常抛出去
        }
//        testException("m1");//模拟报错
        System.out.println("m1内业务逻辑执行完毕！");

        TransactionQueue.startMonitor(param);//!!!监听位置(一定要放在内部业务逻辑最后)
    }

    /**
     * 测试方法2
     * (方法内不要捕获业务逻辑的异常，否则事务无法回滚)
     * @param param
     * @return
     */
    @Transactional(rollbackFor = Exception.class)//事务2
    public void m2(Map param) {
        String param2 = MapUtils.getString(param, "Param2");
        System.out.println("m2从param取出自己的参数：" + param2);

        System.out.println("。。。m2内的业务逻辑。。。");
        try {//service里的非运行时异常，一定要处理掉，也就是方法上不要有throws Exception(否则controller里无法把该方法写成“方法引用”形式)
            Thread.sleep(1500);//模拟执行1500毫秒
        } catch (InterruptedException e) {
            throw new RuntimeException(e);//如果这里处理不了，可以转成运行时异常抛出去
        }
//        testException("m2");//模拟报错
        System.out.println("m2内业务逻辑执行完毕！");

        TransactionQueue.startMonitor(param);//!!!监听位置(一定要放在内部业务逻辑最后)
    }

    /**
     * 测试方法3
     * (方法内不要捕获获业务逻辑的异常，否则事务无法回滚)
     * @param param
     * @return
     */
    @Transactional(rollbackFor = Exception.class)//事务3
    public void m3(Map param) {
        String param3 = MapUtils.getString(param, "Param3");
        System.out.println("m3从param取出自己的参数：" + param3);

        System.out.println("。。。m3内的业务逻辑。。。");
        try {//service里的非运行时异常，一定要处理掉，也就是方法上不要有throws Exception(否则controller里无法把该方法写成“方法引用”的形式)
            Thread.sleep(300);//模拟执行300毫秒
        } catch (InterruptedException e) {
            throw new RuntimeException(e);//如果这里处理不了，可以转成运行时异常抛出去
        }
        testException("m3");//模拟报错
        System.out.println("m3内业务逻辑执行完毕！");

        TransactionQueue.startMonitor(param);//!!!监听位置(一定要放在内部业务逻辑最后)
    }

    /**
     * 模拟报错
     * @param method
     */
    private void testException(String method) {
        if (3 > 0) {
            throw new RuntimeException(method + "测试报错");
        }
    }
}
